package com.kaikeba.dao;

import com.kaikeba.bean.Express;
import com.kaikeba.exception.DuplicateCodeException;

import java.util.List;
import java.util.Map;

/**
 * @description:
 * @author: ManolinCoder
 * @time: 2021/8/30
 */
public interface BaseExpressDao {
    /**
     * @Author LC
     * @Description //TODO 用于查询数据库中的全部快递（总数+新增）和待取件快递（总数+新增）
     * @Date 19:59 2021/8/30
     * @Param
     * @return [{size:总数,day:新增},{size:总数,day:新增}]
     **/
    List<Map<String,Integer>> console();

    /**
     * @Author LC
     * @Description //TODO 用于查询所有快递
     * @Date 20:02 2021/8/30
     * @Param [limit 是否分页的标记，true表示分页。false表示查询所有快递, offset SQL语句的起始索引, pageNumber 每一页查询的数量]
     * @return 快递的集合
     **/
    List<Express> findAll(boolean limit,int offset,int pageNumber);

    /**
     * @Author LC
     * @Description //TODO 根据快递单号，查询快递信息
     * @Date 20:11 2021/8/30
     * @Param [number 单号]
     * @return 查询的快递信息，单号不存在时返回null
     **/
    Express findByNumber(String number);

    /**
     * @Author LC
     * @Description //TODO 根据快递id，查询快递信息
     * @Date 19:19 2021/9/12
     * @Param [id 快递的唯一标识]
     * @return 查询的快递信息，id不存在时返回null
     **/
    Express findById(int id);

    /**
     * @Author LC
     * @Description //TODO 根据快递取件码，查询快递信息
     * @Date 20:11 2021/8/30
     * @Param [code 取件码]
     * @return 查询的快递信息，取件码不存在时返回null
     **/
    Express findByCode(String code);

    /**
     * @Author LC
     * @Description //TODO 根据用户的手机号码，查询他所有的快递信息
     * @Date 20:11 2021/8/30
     * @Param [userPhone 手机号码]
     * @return 查询的快递信息列表
     **/
    List<Express> findByUserPhone(String userPhone);

    /**
     * @Author LC
     * @Description //TODO 根据单号和用户的手机号码或录入人的电话号码，查询快递信息
     * @Date 14:09 2021/9/14
     * @Param [number 快递单号, userPhone 用户的手机号, sysPhone 录入人的电话号码]
     * @return 查询的快递信息
     **/
    Express findByNumberAndPhone(String number,String userPhone,String sysPhone);

    /**
     * @Author LC
     * @Description //TODO 根据用户的手机号码和快递的status，查询他相应status的快递信息
     * @Date 20:11 2021/8/30
     * @Param [userPhone 手机号码]
     * @return 查询的快递信息列表
     **/
    List<Express> findByUserPhoneAndStatus(String userPhone,int status);

    /**
     * @Author LC
     * @Description //TODO 根据录入人的手机号码，查询录入的所有记录
     * @Date 20:11 2021/8/30
     * @Param [sysPhone 手机号码]
     * @return 查询的快递信息列表
     **/
    List<Express> findBySysPhone(String sysPhone);

    /**
     * @Author LC
     * @Description //TODO 快递的录入
     * @Date 20:19 2021/8/30
     * @Param [e 要录入的快递对象]
     * @return 录入的结果,true表示成功,false表示失败
     **/
    boolean insert(Express e) throws DuplicateCodeException;

    /**
     * @Author LC
     * @Description //TODO 快递的修改
     * @Date 20:22 2021/8/30
     * @Param [id 要修改额快递id, newExpress 新的快递对象(number,company,username,userPhone)]
     * @return 修改的结果，true表示成功，false表示失败
     **/
    boolean update(int id,Express newExpress);

    /**
     * @Author LC
     * @Description //TODO 更改快递的状态为1,表示取件完成
     * @Date 20:26 2021/8/30
     * @Param [code 要修改的快递的取件码]
     * @return 修改的结果，true表示成功，false表示失败
     **/
    boolean updateStatus(String code);

    /**
     * @Author LC
     * @Description //TODO 根据id，删除单个快递信息
     * @Date 20:27 2021/8/30
     * @Param [id 要删除的快递id]
     * @return 删除的结果，true表示成功，false表示失败
     **/
    boolean delete(int id);
}
